#include <iostream>
#include <vector>
#include "Human.h"

using namespace std;
using namespace barton;

/**
 * 打印数组
 * 第一种方法是用到了迭代器
 * 第二种就是普通的for循环遍历
 * @param v 这个地方为什么要带&这个取地址符号，不带行不行？自己测试下
 */
void printVector(vector<int> &v) {

    // 迭代器遍历打印
    vector<int>::iterator it;
    for (it = v.begin(); it != v.end() ; it++) {
        cout << *it << " ";
    }
    cout<<endl;

    // 普通的for循环遍历打印
//    for (int i = 0; i < v.size(); ++i) {
//        cout << v.at(i) << " ";
//    }
//    cout<<endl;
}

/**
 * 测试数组
 */
void testVector() {
    // 数组，连续的内存块，
    vector<int> v;

    // push_back是插入操作 [1][13][12][33][22][10]
    v.push_back(1);
    v.push_back(13);
    v.push_back(12);
    v.push_back(33);
    v.push_back(22);
    v.push_back(10);
    // 测试下打印整个数组
    printVector(v);

    // pop_back弹出最后的那个元素，
    // 可以拷贝这行看看弹两次打印下是什么效果
    v.pop_back();
    printVector(v);

    // 排序，调用自带的函数即可，这里里面的实现应该是快速排序
    cout << "--------Now sort the vector----------" << endl;
    sort(v.begin(), v.end());
    printVector(v);

    reverse(v.begin(), v.end());
    printVector(v);

}

int main() {
    cout << "Hello, World!" << endl;

    /**
     * C11后引入了关键字auto可以类型推导，就是你用auto编译器知道这是个Human类型
     * 我学的时候还没有就是下面这种写法 Human* h = new Human();
     * 这个地方用new操作符在堆上申请了一块内存空间，
     * C++是自己控制内存的和java，python的不同，这是它难的地方也是比其他语言的优势的地方
     * 在最后要用delete回收这块内存，不然会内存泄漏。
     * 堆上new出来占用的内存不手动delete是不会释放的。（切记）
     */
//    Human* h = new Human();
    auto h = new Human();
    h->setName("barton");
    h->printName();
    delete h;

    cout<<"------------test vector---------------"<<endl;
    testVector();

    return 0;
}


